package org.example.netty.test.nio.netty.chat.util;

import io.netty.channel.Channel;
import org.example.netty.test.nio.netty.chat.bean.User;
import org.example.netty.test.nio.netty.chat.common.SystemId;
import org.example.netty.test.nio.netty.chat.session.UserSession;

import java.util.*;

/**
 * @author zp
 * @version 1.0
 * @description: 针对Channel的工具类
 * @date 2023/4/7 19:26
 */
public class NettyChannelUtil {
    /**
     * 服务端使用 判断一个通道是否有用户在使用
     * 可做信息转发时判断该通道是否合法
     *
     * @param channel
     * @return
     */
    public static boolean hasUserSession(Channel channel) {
        //netty移除了这个map的remove方法,这里的判断谨慎一点
        return (channel.hasAttr(SystemId.USER_SESSION_KEY) && channel.attr(SystemId.USER_SESSION_KEY).get() != null);
    }





    /**
     * @param channel
     * @return boolean
     * @description: 客户端使用 判断一个通道是否有用户在使用 可做信息转发时判断该通道是否合法
     * @author zp
     * @date: 2023/4/9 16:01
     */
    public static boolean hasUser(Channel channel) {
        //netty移除了这个map的remove方法,这里的判断谨慎一点
        return (channel.hasAttr(SystemId.USER_KEY) || channel.attr(SystemId.USER_KEY).get() != null);
    }

    /**
     * @param channel
     * @return UserSession
     * @description: 获取userSession对象
     * @author zp
     * @date: 2023/4/8 19:34
     */
    public static UserSession getUserSession(Channel channel) {
        if (!hasUserSession(channel)) {
            return null;
        }
        //netty移除了这个map的remove方法,这里的判断谨慎一点
        return channel.attr(SystemId.USER_SESSION_KEY).get();
    }

    /**
     * @param channel
     * @description: 删除登入session
     * @author zp
     * @date: 2023/4/13 19:26
     */
    public static void removeUserSession(Channel channel) {
        channel.attr(SystemId.USER_SESSION_KEY).set(null);
    }

    /**
     * @param channel
     * @return User
     * @description: 获取User对象
     * @author zp
     * @date: 2023/4/8 19:35
     */
    public static User getUserServer(Channel channel) {
        if (!hasUserSession(channel)) {
            return null;
        }
        //netty移除了这个map的remove方法,这里的判断谨慎一点
        return channel.attr(SystemId.USER_SESSION_KEY).get().getUser();
    }

    public static User getUserClient(Channel channel) {
        if (!hasUser(channel)) {
            return null;
        }
        //netty移除了这个map的remove方法,这里的判断谨慎一点
        return channel.attr(SystemId.USER_KEY).get();
    }

    /**
     * @description: 密码字符串加密的方法
     * @author zp
     * @date: 2023/5/7 19:06
     * @param password
     * @return String
     */
    public static String replaceWithAsterisks(String password) {
        StringBuilder sb = new StringBuilder();
        for (int i = 0; i < password.length(); i++) {
            sb.append("*");
        }
        return sb.toString();
    }

    /**
     * @param userNames
     * @return String
     * @description: 输出名字列表
     * @author zp
     * @date: 2023/4/16 17:41
     */
    public static String getNameList(String title, Set<String> userNames) {
        StringBuilder buffer = new StringBuilder();
        buffer.append(title).append("：[");
        for (String name : userNames) {
            buffer.append("\n").append(name).append(",");
        }
        String string = buffer.substring(0, buffer.length()-1);
        string += "]";
        return string;
    }

    public static void main(String[] args) {
        Map<String, String> map = new HashMap<>();
        map.put("zhangs", "sadas");
        map.put("zhangs1", "sadas");
        map.put("zhangs2", "sadas");
        map.put("zhangs3", "sadas");
        map.put("zhangs4", "sadas");
        ArrayList<String> strings = new ArrayList<>(map.keySet());
        System.out.println(strings);
    }
}
